package com.ucode.application.security;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.ucode.springboot.starter.security.entity.UcodeUserDetails;
import com.ucode.springboot.starter.security.service.UcodeSecurityOperationService;
import com.ucode.sys.model.Role;
import com.ucode.sys.model.RoleMenu;
import com.ucode.sys.model.User;
import com.ucode.sys.service.RoleService;
import com.ucode.sys.service.UserService;
import com.ucode.tool.exception.UcodeUnauthenticatedException;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;

/**
 * 当前登录用户信息Service
 * @author: liliang
 * @date: 2019年12月27日 下午4:57:41
 */
@Service
public class CurrentLoginUserService {

    @Autowired
    private UcodeSecurityOperationService ucodeSecurityOperationService;
    
    @Autowired
    private UserService userService;
    @Autowired
    public RoleService roleService;
    
    /**
     * 当前登录用户Id
     * @author liliang
     * @date 2019年12月27日
     * @return
     */
    public Long getCurrentUserId(){
        UcodeUserDetails user = ucodeSecurityOperationService.getCurrentUser();
        if(user == null || user.getUser() == null || StrUtil.isBlank(user.getUser().getUserId()))
            throw new UcodeUnauthenticatedException();
        return Long.valueOf(user.getUser().getUserId());
    }
    
    /**
     * 当前登录用户信息
     * @author liliang
     * @date 2020年2月10日
     * @return
     */
    public User getCurrentUser(){
        Long userId = this.getCurrentUserId();
        User user = userService.findById(userId);
        user.setPassword(null);//把密码屏蔽掉
        return user;
    }
    
    /**
     * 当前登录用户权限
     * @author liliang
     * @date 2020年2月10日
     * @return
     */
    public Set<String> getCurrentUserRoles(){
        Long userId = this.getCurrentUserId();
        Set<String> roles = new HashSet<String>();
        List<Role> roleObjs = roleService.findRolesByUserId(userId);
        if(CollUtil.isNotEmpty(roleObjs)){
            List<Long> roleIds = new ArrayList<Long>();
            for (Role role : roleObjs) {
                if(StrUtil.isNotBlank(role.getCode())){
                    roles.add(role.getCode());
                }
                roleIds.add(role.getId());
            }
            
            List<RoleMenu> permissions = roleService.findListByRoleIds(roleIds);
            if(CollUtil.isNotEmpty(permissions)){
                roles = new HashSet<String>();
                for(RoleMenu roleMenu : permissions){
                    roles.add(roleMenu.getPermission());
                }
            }
        }
        
        return roles;
    }
}
